package ru.chezclif.lern.conread;

import java.util.ArrayList;
import java.util.List;

/**
 * Класс основного хранилища настроек. Не защищен.
 * 
 * @author Vit
 * 
 */
public class DataBuffer {
	/** Заглавный комментарий */
	private String headerComment = "";
	/** Конечный комментарий */
	private String footerComment = "";
	/** Коллекция с настройками типа ключ и значение */
	private final List<PropertyElements> elements = new ArrayList<PropertyElements>();

	/**
	 * Получить значение настройки по ключу
	 * 
	 * @param key ключ
	 */
	public String getSetting(String key) {
		Preconditions.notBlank(key);
		Preconditions.notNull(key);
		String localValue = "";
		for (PropertyElements element : elements) {
			if (element.getKey().equals(key)) {
				localValue = element.getValue();
				break;
			}
		}
		return localValue;
	}

	/**
	 * Задать ключу значение
	 * 
	 * @param key ключ
	 * @param value значение
	 */
	public void setSetting(String key, String value) {
		Preconditions.notBlank(key, value);
		Preconditions.notNull(key, value);
		elements.add(new PropertyElements(key, value));
	}

	/**
	 * Удалить одну настройку (ключ со значением)
	 * 
	 * @param key ключ
	 * @param value значение
	 */
	public void removeSetting(String key, String value) {
		Preconditions.notBlank(key, value);
		Preconditions.notNull(key, value);
		for (PropertyElements element : elements) {
			if ((element.getKey().equals(key)) && (element.getValue().equals(value))) {
				elements.remove(element);
				break;
			}
		}
	}

	/** Получить заглавный комментарий */
	public String getHeaderComment() {
		return headerComment;
	}

	/**
	 * Задать заглавный комментарий
	 * 
	 * @param headerComment Заглавный комментарий
	 */
	public void setHeaderComment(String headerComment) {
		Preconditions.notNull(headerComment);
		this.headerComment = headerComment;
	}

	/** Получить конечный комментарий */
	public String getFooterComment() {
		return footerComment;
	}

	/**
	 * Задать конечный комментарий
	 * 
	 * @param footerComment Конечный комментарий
	 */
	public void setFooterComment(String footerComment) {
		Preconditions.notNull(footerComment);
		this.footerComment = footerComment;
	}

	/**
	 * Получить коллекцию всех ключей из хранилища настроек
	 * 
	 * @param localBufferForKeys коллекция для заполнения ее ключами
	 */
	public List<String> getKeys(List<String> localBufferForKeys) {
		Preconditions.notNull(localBufferForKeys);
		for (PropertyElements element : elements) {
			localBufferForKeys.add(element.getKey());
		}
		return localBufferForKeys;
	}

	/**
	 * Получить коллекцию ключей находящихся в определенной субсекции
	 * 
	 * @param localBufferForKeys коллекция для заполнения ее ключами
	 */
	public List<String> getSubsectionKeys(String sectionName, List<String> localBufferForSubsectionKeys) {
		Preconditions.notNull(localBufferForSubsectionKeys);
		Preconditions.notBlank(sectionName);
		Preconditions.notNull(sectionName);
		for (PropertyElements element : elements) {
			if ((element.getKey()).indexOf(sectionName) != -1) {
				localBufferForSubsectionKeys.add(element.getKey());
			}
		}
		return localBufferForSubsectionKeys;
	}

	/**
	 * Получить коллекцию значений находящихся в определенной субсекции
	 * 
	 * @param sectionName название секции до точки
	 * @param localBufferForSubsectionvalues коллекция для заполнения ее ключами из субсекции
	 */
	public List<String> getSubsectionValues(String sectionName, List<String> localBufferForSubsectionvalues) {
		Preconditions.notNull(localBufferForSubsectionvalues);
		Preconditions.notBlank(sectionName);
		Preconditions.notNull(sectionName);
		for (PropertyElements element : elements) {
			if ((element.getKey()).indexOf(sectionName) != -1) {
				localBufferForSubsectionvalues.add(element.getValue());
			}
		}
		return localBufferForSubsectionvalues;
	}

	/** Получить коллекцию типа PropertyElements со всеми настройками */
	public List<PropertyElements> getElements() {
		return elements;
	}

	/**
	 * Задать коллекцию типа PropertyElements
	 * 
	 * @param elements Заполненная коллекция типа PropertyElements
	 */
	public void setElements(List<PropertyElements> elements) {
		Preconditions.notNull(elements);
		this.elements.clear();
		this.elements.addAll(elements);
	}
}
